<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="generator" content="pandoc">
  <meta name="author" content="滨州学院">
  <title>实用软件工程</title>
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
  <link rel="stylesheet" href="reveal.js/css/reset.css">
  <link rel="stylesheet" href="reveal.js/css/reveal.css">
  <style>
      code{white-space: pre-wrap;}
      span.smallcaps{font-variant: small-caps;}
      span.underline{text-decoration: underline;}
      div.column{display: inline-block; vertical-align: top; width: 50%;}
  </style>
  <link rel="stylesheet" href="reveal.js/css/theme/white.css" id="theme">
  <!-- Printing and PDF exports -->
  <script>
    var link = document.createElement( 'link' );
    link.rel = 'stylesheet';
    link.type = 'text/css';
    link.href = window.location.search.match( /print-pdf/gi ) ? 'reveal.js/css/print/pdf.css' : 'reveal.js/css/print/paper.css';
    document.getElementsByTagName( 'head' )[0].appendChild( link );
  </script>
  <!--[if lt IE 9]>
  <script src="reveal.js/lib/js/html5shiv.js"></script>
  <![endif]-->
</head>
<body>
  <div class="reveal">
    <div class="slides">

<section id="title-slide">
  <h1 class="title">实用软件工程</h1>
  <p class="subtitle">CH04 系统设计</p>
  <p class="author">滨州学院</p>
</section>

<section id="学习目标" class="slide level2">
<h2>学习目标</h2>
<ul>
<li>掌握：概要设计和详细设计的基本任务；数据库设计的方法。</li>
<li>熟悉：系统设计的基本概念和工具。</li>
</ul>
</section>
<section><section id="系统设计的基本概念" class="title-slide slide level1"><h1>4.1 系统设计的基本概念</h1></section><section id="软件设计" class="slide level2">
<h2>软件设计</h2>
<dl>
<dt>软件设计</dt>
<dd>软件设计是一个把软件需求转换为软件表示的过程。
</dd>
<dd>系统设计的基本目标是用比较抽象和概括的方式确定目标系统如何完成预定的任务，
</dd>
<dd>软件设计是确定系统的物理模型。
</dd>
</dl>
</section><section id="系统设计的重要性" class="slide level2">
<h2>系统设计的重要性</h2>
<ul>
<li>占据软件项目开发成本的绝大部分</li>
<li>开发阶段最重要的步骤</li>
<li>设计决策影响软件实现的成败</li>
<li>是软件工程和软件维护的基础</li>
</ul>
</section><section id="系统设计的内容" class="slide level2">
<h2>系统设计的内容</h2>
<ul>
<li>软件结构设计
<ul>
<li>定义软件系统各主要部件之间的关系</li>
</ul></li>
<li>数据设计
<ul>
<li>将分析时创建的模型转化为数据结构的定义</li>
</ul></li>
<li>接口设计
<ul>
<li>描述软件内部、软件和协作系统之间以及软件与人之间如何通信</li>
</ul></li>
<li>过程设计
<ul>
<li>将系统结构部件转换成软件的过程性描述</li>
</ul></li>
</ul>
</section><section id="系统设计的总体步骤" class="slide level2">
<h2>系统设计的总体步骤</h2>
<ul>
<li>概要设计
<ul>
<li>将软件需求转化为软件体系结构</li>
<li>确定系统级接口、全局数据结构或数据库模式</li>
</ul></li>
<li>详细设计
<ul>
<li>确立每个模块的实现算法和局部数据结构</li>
<li>用适当的方法表示算法和数据结构的细节</li>
</ul></li>
<li>软件设计的迭代过程
<ul>
<li>先进行高层次结构设计</li>
<li>再进行低层次的过程设计</li>
<li>最后穿插进行数据设计和接口设计</li>
</ul></li>
</ul>
</section></section>
<section><section id="系统设计的目的和任务" class="title-slide slide level1"><h1>4.2 系统设计的目的和任务</h1></section><section id="概要设计的基本任务" class="slide level2">
<h2>概要设计的基本任务</h2>
<ul>
<li>1）设计软件系统结构</li>
<li>2）进行数据结构及数据库设计</li>
<li>3）编写概要设计文档</li>
<li>4）评审</li>
</ul>
</section><section id="详细设计的基本任务" class="slide level2">
<h2>详细设计的基本任务</h2>
<ul>
<li>1）对每个模块进行详细的算法设计</li>
<li>2）对模块内的数据结构进行设计</li>
<li>3）对数据库进行物理设计，确定数据的物理结构</li>
<li>4）其他设计：代码设计；输入、输出格式设计；人机对话设计</li>
<li>5）编写详细设计说明书</li>
<li>6）评审</li>
</ul>
</section></section>
<section><section id="概要设计" class="title-slide slide level1"><h1>4.3 概要设计</h1></section><section id="概要设计原理" class="slide level2">
<h2>1. 概要设计原理</h2>
<ul>
<li>模块和模块化</li>
<li>抽象与逐步求精</li>
<li>信息隐藏</li>
<li>模块独立性</li>
</ul>
</section><section id="模块和模块化" class="slide level2">
<h2>模块和模块化</h2>
<dl>
<dt>模块</dt>
<dd>是指具有相对独立性的，有数据说明、执行语句等程序对象构成的集合。
</dd>
<dd>每个模块单独命名，通名称访问指定模块
</dd>
<dd>高级语言中表现为函数、子程序、过程等
</dd>
</dl>
</section><section class="slide level2">

<dl>
<dt>模块的四个特征</dt>
<dd>输入输出：模块需要和产生的信息
</dd>
<dd>功能：模块所做的工作
</dd>
<dd>内部数据：仅供该模块本身引用的数据
</dd>
<dd>程序代码：模块通过程序代码完成其功能
</dd>
<dt>模块的内部特征和外部特征</dt>
<dd>外部特征：输入输出、功能
</dd>
<dd>内部特征：内部数据、程序代码
</dd>
</dl>
</section><section class="slide level2">

<dl>
<dt>模块化</dt>
<dd>是指将整个程序划分为若干个模块，每个模块用于实现一个特定的功能。
</dd>
<dd>划分模块可以降低解决问题的难度 <span class="math inline"><em>C</em>(<em>P</em><sub>1</sub> + <em>P</em><sub>2</sub>) &gt; <em>C</em>(<em>P</em><sub>1</sub>) + <em>C</em>(<em>P</em><sub>2</sub>)</span>
</dd>
<dd>随着模块数目增加，设计模块接口所需工作量也将增加，应适当控制模块数目
</dd>
</dl>
</section><section id="抽象与逐步求精" class="slide level2">
<h2>抽象与逐步求精</h2>
<dl>
<dt>抽象</dt>
<dd>就是抽出事物的本质特性而暂时不考虑它们的细节。
</dd>
<dt>逐步求精</dt>
<dd>为了集中精力解决主要问题而尽量推迟对问题细节的考虑。
</dd>
</dl>
</section><section id="信息隐藏" class="slide level2">
<h2>信息隐藏</h2>
<dl>
<dt>信息隐藏</dt>
<dd>是指在设计和确定模块时，使得一个模块包含的信息对于不需要这些信息的其他模块来说是不能访问的。
</dd>
</dl>
</section><section id="模块独立性" class="slide level2">
<h2>模块独立性</h2>
<dl>
<dt>模块独立性</dt>
<dd>是指软件系统中的每个模块只涉及软件要求的具体子功能，而和软件系统中其他模块之间的联系最小且接口是简单的。
</dd>
<dd>模块独立性强，则信息隐藏性好，模块的可理解性、可维护性、可测试性好，可靠性也好
</dd>
<dd>独立性强的模块易于开发，可并行工作，生产率高
</dd>
<dd>模块的独立性使用耦合性和内聚性进行度量
</dd>
</dl>
</section><section id="耦合性" class="slide level2">
<h2>耦合性</h2>
<dl>
<dt>耦合性</dt>
<dd>是模块之间相互连接的紧密程度的度量。从低到高分别是：
</dd>
<dd>无直接耦合、数据耦合、标记耦合、控制耦合、公共耦合、内容耦合
</dd>
<dd>软件设计中应追求尽可能松散的耦合系统。
</dd>
</dl>
</section><section id="内聚性" class="slide level2">
<h2>内聚性</h2>
<dl>
<dt>内聚性</dt>
<dd>是度量一个模块内部各个组成元素之间相互结合的紧密程度的指标。由低到高分别是：
</dd>
<dd>偶然内聚、逻辑内聚、时间内聚、通信内聚、顺序内聚、功能内聚
</dd>
<dd>优秀的软件设计应尽量做到高内聚、低耦合
</dd>
</dl>
</section><section id="软件结构优化准则" class="slide level2">
<h2>2. 软件结构优化准则</h2>
<ul>
<li>模块的分解尽量做到“高内聚，低耦合”。</li>
<li>模块结构的深度、宽度、扇出和扇入应适当。</li>
<li>模块的作用范围应该在控制范围内。</li>
<li>模块接口设计要简单，以便降低复杂程度和冗余度。</li>
<li>适当设置模块规模，以保持其独立性。</li>
<li>模块功能应该可以预测。</li>
</ul>
</section><section id="软件结构设计的图形工具" class="slide level2">
<h2>3. 软件结构设计的图形工具</h2>
<ul>
<li>软件结构图</li>
<li>层次图</li>
<li>HIPO 图</li>
</ul>
</section><section id="软件结构图" class="slide level2">
<h2>软件结构图</h2>
<ul>
<li>基本符号：模块、模块的调用关系和辅助符号</li>
<li>模块：每个方框代表一个模块</li>
<li>模块的调用关系：方框之间的箭头（或直线）表示模块之间的调用关系
<ul>
<li>调用模块在上，被调用模块在下</li>
<li>可以用箭头表示调用过程中传递的信息</li>
</ul></li>
<li>辅助符号：弧形箭头表示循环调用，菱形表示选择或者条件调用</li>
</ul>
</section><section id="层次图" class="slide level2">
<h2>层次图</h2>
<ul>
<li>层次图用来描绘软件的层次结构</li>
<li>每个方框表示一个模块</li>
<li>矩形框之间的关系表示调用关系</li>
<li>适用于自顶向下设计软件结构的过程</li>
</ul>
</section><section id="hipo-图" class="slide level2">
<h2>HIPO 图</h2>
<ul>
<li>层次图加输入/处理/输出图</li>
<li>在 H 图（层次图）中用矩形框表示模块</li>
<li>对各子模块编号</li>
<li>每个矩形框还要对应一张 IPO 图描绘这个模块的处理过程</li>
</ul>
</section><section id="面向数据流的设计方法" class="slide level2">
<h2>4. 面向数据流的设计方法</h2>
<ul>
<li>典型的数据流类型有两种：
<ul>
<li>变换型</li>
<li>事务型</li>
</ul></li>
</ul>
</section><section class="slide level2">

<dl>
<dt>变换型</dt>
<dd>信息沿输入通路进入系统，同时由外部形式变换成内部形式，进入系统的信息通过变换中心，经过加工后再沿输出通路变换成外部形式离开软件系统。
</dd>
</dl>
</section><section class="slide level2">

<dl>
<dt>事务型</dt>
<dd>数据沿输入通路到达一个处理，这个处理根据输入数据的类型在若干个动作序列中选出一个来执行，这种“以事务为中心”的数据流称为“事务流”。
</dd>
</dl>
</section><section id="软件体系结构设计" class="slide level2">
<h2>5. 软件体系结构设计</h2>
<dl>
<dt>软件体系结构</dt>
<dd>软件体系结构为软件系统提供了一个结构、行为和属性的高级抽象，由构成系统的元素的描述、这些元素之间的相互作用、指导元素集成的模式以及这些模式的约束组成。
</dd>
</dl>
</section><section id="软件体系结构的分类" class="slide level2">
<h2>软件体系结构的分类</h2>
<ul>
<li>主机-终端体系结构</li>
<li>客户-服务器（C/S）体系结构</li>
<li>浏览器-服务器（B/S）体系结构</li>
<li>三层 C/S 软件体系结构</li>
</ul>
</section><section id="bs-结构相对于-cs-结构的对比" class="slide level2">
<h2>B/S 结构相对于 C/S 结构的对比</h2>
<ul>
<li>开发和维护成本</li>
<li>客户端负载</li>
<li>灵活性</li>
<li>移植性</li>
<li>用户界面风格</li>
</ul>
</section><section id="概要设计说明书" class="slide level2">
<h2>概要设计说明书</h2>
<ul>
<li>概要设计说明书又称为系统设计说明书。包括
<ul>
<li>软件系统的基本处理流程、软件系统的组织结构、模块划分、功能分配、接口设计、运行设计、数据结构设计、出错处理设计等。</li>
</ul></li>
</ul>
</section></section>
<section><section id="详细设计" class="title-slide slide level1"><h1>4.4 详细设计</h1></section><section id="详细设计-1" class="slide level2">
<h2>详细设计</h2>
<ul>
<li>概要设计阶段将软件系统分解成多个模块，并确定每个模块的外部特征
<ul>
<li>功能（做什么）和界面（输入和输出）</li>
</ul></li>
<li>详细设计阶段要确定每个模块的内部特征
<ul>
<li>每个模块内部的执行过程（怎样做）</li>
</ul></li>
</ul>
</section><section id="详细设计阶段的描述工具" class="slide level2">
<h2>详细设计阶段的描述工具</h2>
<ul>
<li>图形：流程图、盒图和问题分析图等</li>
<li>语言：各种程序设计语言</li>
<li>表格：判定表等</li>
</ul>
</section><section id="结构化程序设计方法" class="slide level2">
<h2>1. 结构化程序设计方法</h2>
<ul>
<li>1969年，Dijkstra 提出了结构化程序设计方法：
<ul>
<li>以模块化设计为中心</li>
<li>将待开发系统划分为若干相互独立的模块</li>
</ul></li>
</ul>
</section><section id="结构化程序设计方法的基本要点" class="slide level2">
<h2>结构化程序设计方法的基本要点</h2>
<ul>
<li>1）采用自顶向下、逐步求精的程序设计方法和“单入口、单出口”的控制结构。</li>
<li>2）使用三种基本控制结构（顺序、选择和循环）构造程序。</li>
<li>3）开发支持库，文档库由专职资料员来维护。</li>
<li>4）采用主程序员组的组织形式。</li>
</ul>
</section><section id="详细设计描述工具" class="slide level2">
<h2>2. 详细设计描述工具</h2>
<ul>
<li>流程图</li>
<li>盒图（N-S 图）</li>
<li>问题分析图（PAD 图）</li>
<li>过程设计语言（PDL）</li>
</ul>
</section><section id="用户界面设计" class="slide level2">
<h2>3. 用户界面设计</h2>
<ul>
<li>好的用户界面</li>
<li>用户界面设计原则</li>
<li>用户界面设计过程</li>
<li>人机界面设计指南</li>
</ul>
</section><section id="jackson-方法" class="slide level2">
<h2>4. Jackson 方法</h2>
<dl>
<dt>Jackson 方法</dt>
<dd>是一种面向数据结构的方法
</dd>
<dd>适用于数据处理类问题
</dd>
<dd>目标：获得简单清晰的设计方案
</dd>
<dd>设计原则：使程序结构同数据结构相对应
</dd>
<dd>描述工具：Jackson 图
</dd>
</dl>
</section><section class="slide level2">

<ul>
<li>Jackson 图描述就数据结构：
<ul>
<li>方框表示数据</li>
</ul></li>
<li>Jackson 图描述程序结构：
<ul>
<li>方框表示模块</li>
</ul></li>
</ul>
</section><section id="jackson-图" class="slide level2">
<h2>Jackson 图</h2>
<ul>
<li>顺序结构
<ul>
<li>数据由一个或多个数据元素组成，每个元素按确定的次序出现一次</li>
</ul></li>
<li>选择结构
<ul>
<li>包含两个或多个数据元素，每次使用这个数据时按一定条件从这些数据元素中选择一个</li>
<li>右上角用圆圈做标记</li>
</ul></li>
<li>重复结构
<ul>
<li>数据根据使用时的条件由出现零次或多次的数据元素组成</li>
<li>右上角用星号标记</li>
</ul></li>
</ul>
</section><section id="jackson-方法的优缺点" class="slide level2">
<h2>Jackson 方法的优缺点</h2>
<ul>
<li>优点：简单，易学易用，适用于规模不大的数据处理系统</li>
<li>缺点：应用于较大的系统比较困难</li>
</ul>
</section><section id="jackson-方法的设计步骤" class="slide level2">
<h2>Jackson 方法的设计步骤</h2>
<ul>
<li>1）分析并确定输入数据和输出数据的逻辑结构，并用 Jackson 图描述；</li>
<li>2）找出输入数据结构和输出数据结构中的对应关系；</li>
<li>3）由 Jackson 图导出程序结构；</li>
<li>4）列出所有的动作和条件，加入到程序图的适当位置；</li>
<li>5）用伪代码（PDL）表示。</li>
</ul>
</section><section id="详细设计说明书" class="slide level2">
<h2>5. 详细设计说明书</h2>
<ul>
<li>对各个具体模块、类等局部元素的设计描述</li>
</ul>
</section></section>
<section><section id="数据库设计" class="title-slide slide level1"><h1>4.5 数据库设计</h1></section><section id="数据库设计的目标" class="slide level2">
<h2>1. 数据库设计的目标</h2>
<ul>
<li>功能需求
<ul>
<li>存储数据及其联系</li>
<li>CRUD 等操作</li>
</ul></li>
<li>性能需求
<ul>
<li>良好的存储结构、数据共享、数据完整性、数据一致性及安全保密性</li>
</ul></li>
</ul>
</section><section id="数据库设计的步骤" class="slide level2">
<h2>2. 数据库设计的步骤</h2>
<ul>
<li>数据库设计的步骤</li>
<li>数据库设计各阶段的主要任务</li>
</ul>
</section><section id="数据库设计的内容" class="slide level2">
<h2>3. 数据库设计的内容</h2>
<ul>
<li>数据库概念设计</li>
<li>数据库逻辑设计</li>
<li>数据库物理设计</li>
</ul>
</section><section id="数据库概念设计" class="slide level2">
<h2>数据库概念设计</h2>
<ul>
<li>分析数据间内在的语义关联
<ul>
<li>ER 图：用属性、实体以及它们之间的联系描述信息</li>
</ul></li>
</ul>
</section><section id="er图" class="slide level2">
<h2>ER图</h2>
<ul>
<li>实体：客观存在的、相互区别的事物，实体可以是具体的对象
<ul>
<li>用矩形框表示，框内标注实体名称</li>
</ul></li>
<li>属性：实体所具有的性质
<ul>
<li>用椭圆框表示，框内标注属性名称</li>
</ul></li>
<li>联系：实体之间的联系
<ul>
<li>有一对一(1:1)、一对多(1:n)和多对多(m:n)三种联系</li>
<li>用菱形框表示，框内标注联系名称</li>
</ul></li>
</ul>
</section><section id="数据库逻辑设计" class="slide level2">
<h2>数据库逻辑设计</h2>
<ul>
<li>将概念结构转换成特定 DBMS 所支持的数据模块</li>
</ul>
</section><section id="将-er-图转换成关系模型" class="slide level2">
<h2>将 ER 图转换成关系模型</h2>
<ul>
<li>主键：为每个关系指定一个或一组属性唯一标识该关系的元组（记录）</li>
<li>外键：一个关系的主键在另一个关系中重复出现，标识两个关系的联系</li>
</ul>
</section><section id="转换原则" class="slide level2">
<h2>转换原则</h2>
<ul>
<li>每个实体都对应转换为一个关系，实体中的属性对应设置为关系的字段</li>
<li>两个实体存在 1:1 联系：在其中一个关系中设置外键</li>
<li>两个实体存在 1:n 联系：把实体联系“1”一方的实体主键纳入“n”一方实体作为外键</li>
<li>两个实体存在 m:n 联系：需为“联系”单独建立一个关系，其中必须包含由它联系的两个实体的主键</li>
</ul>
</section><section id="数据库物理设计" class="slide level2">
<h2>数据库物理设计</h2>
<ul>
<li>对于给定的逻辑数据模型，选取一个最适合应用环境的物理结构</li>
</ul>
</section></section>
    </div>
  </div>

  <script src="reveal.js/js/reveal.js"></script>

  <script>

      // Full list of configuration options available at:
      // https://github.com/hakimel/reveal.js#configuration
      Reveal.initialize({
        // Push each slide change to the browser history
        history: true,

        // Optional reveal.js plugins
        dependencies: [
          { src: 'reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } },
          { src: 'reveal.js/plugin/zoom-js/zoom.js', async: true },
          { src: 'reveal.js/plugin/notes/notes.js', async: true }
        ]
      });
    </script>
    </body>
</html>
